package com.ccp.dev.workflow.service;

import com.ccp.dev.core.basic.base.BaseService;
import com.ccp.dev.core.basic.util.UUIDUtils;
import com.ccp.dev.core.util.StringUtil;
import com.ccp.dev.workflow.dao.ProcessRunDao;
import com.ccp.dev.workflow.dao.TaskForkDao;
import com.ccp.dev.workflow.model.*;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;

/**
 * ClassDescribe: 任务分发 Service类
 * @author :fanruiqi
 * Date: 2019-08-08
 * Since:1
 */
@Service
public class TaskForkService extends BaseService<TaskFork> {
    @Resource
    private TaskForkDao taskForkDao;
    @Resource
    private ProcessRunDao processRunDao;

    /**
     * 根据流程定义ID删除流程分发信息
     *
     * @param procDefId  流程定义ID
     */
    public void delByProcDefId(String procDefId){
        List<ProcessRun> list = processRunDao.queryByProcDefId(procDefId);
        if(!list.isEmpty()){
            for(ProcessRun pro:list){
                if(ProcessRun.STATUS_FORM.equals(pro.getStatus())){ continue;}
                taskForkDao.delByProcInstId(pro.getProcInstId());
            }
        }
    }

    /**
     * 产生任务分发的记录。
     * <pre>
     *  分发记录记录了。
     *  1.流程实例ID。
     *  2.分发时间。
     *  3.完成分支的数量。
     *  4.分发节点（节点id和节点名称）
     *  5.汇总的节点（节点id和节点名称）
     *  6.记录分发的令牌。
     *  7.分发的层次，是1级分发，还是二级分发。
     * </pre>
     * @param delegateTask 产生的分发任务
     * @param joinTaskName 汇总任务名
     * @param joinTaskKey 汇总任务key
     * @param forkCount 分发用户的个数。
     */
    public TaskFork newTaskFork(DelegateTask delegateTask, String joinTaskName, String joinTaskKey, Integer forkCount){
        //获取当前任务的分发的令牌, value as T_1 or T_1_2
        String token=(String)delegateTask.getVariableLocal(TaskFork.TAKEN_VAR_NAME);

        TaskFork taskFork=new TaskFork();
        taskFork.setTaskForkId(UUIDUtils.getUUIDFor32());
        taskFork.setProcInstId(delegateTask.getProcessInstanceId());
        taskFork.setForkTime(new Date());
        taskFork.setFininshCount(0);
        taskFork.setForkCount(forkCount);
        taskFork.setForkTaskKey(delegateTask.getTaskDefinitionKey());
        taskFork.setForkTaskName(delegateTask.getName());
        taskFork.setJoinTaskKey(joinTaskKey);
        taskFork.setJoinTaskName(joinTaskName);

        Integer sn=1;
        if(token==null) {
            taskFork.setForkTokenPre(TaskFork.TAKEN_PRE+"_");
        }
        else{
            String[]lines=token.split("[_]");
            if(lines!=null && lines.length>1){
                sn=lines.length-1;
                String forkTokenPre=token.substring(0, token.lastIndexOf(lines[sn]));
                taskFork.setForkTokenPre(forkTokenPre);
            }
        }
        //记录分发令牌。
        String forkTokens="";
        for(int i=1;i<=forkCount;i++){
            forkTokens+=taskFork.getForkTokenPre() + i + ",";
        }
        taskFork.setForkTokens(forkTokens);
        //记录分发的层次。
        taskFork.setForkSn(sn);
        add(taskFork);
        return taskFork;
    }

    /**
     * 返回带有某个流程实例汇总的令牌的分发实体
     * @param procInstId  流程实例ID
     * @param joinTaskKey 汇总任务key
     * @param forkToken   分发令牌
     * @return
     */
    public TaskFork getByInstIdJoinTaskKeyForkToken(String procInstId,String joinTaskKey,String forkToken){
        Map<String,Object> params=new HashMap<>(5);
        params.put("procInstId", procInstId);
        params.put("joinTaskKey", joinTaskKey);
        params.put("forkToken", StringUtil.isNotEmpty(forkToken)?("%"+forkToken+",%"):forkToken);
        return taskForkDao.getByInstIdJoinTaskKeyForkToken(params);
    }
}
